Route 53 Resolver Endpointに必要なセキュリティグループのルールを確認してみた
AWS公式ドキュメントに0.0.0.0/0を許可しろとあるけれども
こんにちは、のんピ(@non____97)です。
皆さんはRoute 53 Resolver Endpointに必要なセキュリティグループのルールが気になったことはありますか? 私はあります。
Route 53 Resolver Endpointを使うことによってVPC外からの名前解決の問い合わせを受け付けたり、VPC外に名前解決の問い合わせを転送したりできます。
ここで、AWS公式ドキュメントを見ると、以下のようにInbound EndpointもOutbound Endpointのどちらのセキュリティグループも0.0.0.0/0
を許可することが推奨されていました。
抜粋 : リゾルバーエンドポイントのスケーリング - Amazon Route 53
Inbound Endpointのインバウンドルールと、Outbound Endpointのアウトバウンドルールはサービスの役割的に必要なのが納得いきますが、Inbound Endpointのアウトバウンドルールと、Outbound Endpointのインバウンドルールが必要なのはよく分かりません。
ということで、Resolver Endpointで名前解決をするにあたって、Inbound Endpointへのアウトバウンドルールと、Outbound Endpointのインバウンドルールが必要なのか確認してみました。
いきなりまとめ
- Route 53 Resolver Endpointのセキュリティグループで以下のように設定しても名前解決できる
- Inbound Endpointにアウトバウンドルールを設定しない
- Outbound Endpointにインバウンドルールを設定しない
検証環境
検証環境は以下の通りです。
Route 53 Resolver Inbound EndpointとOutbound Endpointを作成し、以下のように転送設定をします。
- Route 53 Resolver Rule :
corp.non-97.net
への問い合わせはcorp.non-97.net
のゾーンを管理するDNSサーバーのIPアドレスに転送 - corp.non-97.net のゾーンを管理するDNSサーバー :
amazonaws.com
への問い合わせはRoute 53 Resolver Inbound EndpointのIPアドレスに転送
そして、Inbound Endpointのアウトバウンドルールと、Outbound Endpointのインバウンドルールを設定しない状態で、以下のような名前解決をしてみます。
- スタブリゾルバからRoute 53 Resolverをフルサービスリゾルバとして、
a.corp.non-97.net
の名前解決ができるか - スタブリゾルバから
corp.non-97.net
のゾーンを管理するDNSサーバーをフルサービスリゾルバとして、VPCエンドポイントの名前解決ができるか
検証環境の準備
VPCやcorp.non-97.net
のゾーンを管理するDNSサーバーは以下記事の検証で使った環境を再利用します。
まず、Route 53 Resolver Inbound EndpointとOutbound Endpointそれぞれに割り当てるセキュリティグループを準備します。
それぞれのセキュリティグループのルールは以下の通りです。
# Route 53 Resolver Inbound Endpointに割り当てるセキュリティグループのルール # VPCのCIDR 10.0.1.0/24 からのtcp/53、udp/53を許可するインバウンドルールのみ $ aws ec2 describe-security-group-rules \ --filters 'Name=group-id,Values=sg-0a3c37645af5cc28f' { "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-082a4a5263b557202", "GroupId": "sg-0a3c37645af5cc28f", "GroupOwnerId": "<AWSアカウントID>", "IsEgress": false, "IpProtocol": "tcp", "FromPort": 53, "ToPort": 53, "CidrIpv4": "10.0.1.0/24", "Tags": [] }, { "SecurityGroupRuleId": "sgr-05a385798defe7849", "GroupId": "sg-0a3c37645af5cc28f", "GroupOwnerId": "<AWSアカウントID>", "IsEgress": false, "IpProtocol": "udp", "FromPort": 53, "ToPort": 53, "CidrIpv4": "10.0.1.0/24", "Tags": [] } ] } # Route 53 Resolver Outbound Endpointに割り当てるセキュリティグループのルール # VPCのCIDR 10.0.1.0/24 へのtcp/53、udp/53を許可するアウトバウンドルールのみ $ aws ec2 describe-security-group-rules \ --filters 'Name=group-id,Values=sg-0daba2c1761b6912d' { "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-0b113042f1845a569", "GroupId": "sg-0daba2c1761b6912d", "GroupOwnerId": "<AWSアカウントID>", "IsEgress": true, "IpProtocol": "udp", "FromPort": 53, "ToPort": 53, "CidrIpv4": "10.0.1.0/24", "Tags": [] }, { "SecurityGroupRuleId": "sgr-06873789b733dbc99", "GroupId": "sg-0daba2c1761b6912d", "GroupOwnerId": "<AWSアカウントID>", "IsEgress": true, "IpProtocol": "tcp", "FromPort": 53, "ToPort": 53, "CidrIpv4": "10.0.1.0/24", "Tags": [] } ] }
なお、Route 53 Resolver Endpointに割り当てるセキュリティグループは後から変更することができません。専用のセキュリティグループを用意することをおすすめします。
次に、Route 53 Resolver Endpointを用意します。
作成したRoute 53 Resolver Endpointは以下の通りです。
$ aws route53resolver list-resolver-endpoints { "ResolverEndpoints": [ { "Id": "rslvr-in-ce764e77eda841efb", "CreatorRequestId": "AWSConsole.4.1666952800226", "Arn": "arn:aws:route53resolver:us-east-1:<AWSアカウントID>:resolver-endpoint/rslvr-in-ce764e77eda841efb", "Name": "resolver_inbound", "SecurityGroupIds": [ "sg-0a3c37645af5cc28f" ], "Direction": "INBOUND", "IpAddressCount": 2, "HostVPCId": "vpc-08b84da1f793ed513", "Status": "OPERATIONAL", "StatusMessage": "This Resolver Endpoint is operational.", "CreationTime": "2022-10-28T10:26:40.794323Z", "ModificationTime": "2022-10-28T10:27:03.558Z" }, { "Id": "rslvr-out-d05047ecfc7e4e389", "CreatorRequestId": "AWSConsole.47.1666952800227", "Arn": "arn:aws:route53resolver:us-east-1:<AWSアカウントID>:resolver-endpoint/rslvr-out-d05047ecfc7e4e389", "Name": "resolver_outbound", "SecurityGroupIds": [ "sg-0daba2c1761b6912d" ], "Direction": "OUTBOUND", "IpAddressCount": 2, "HostVPCId": "vpc-08b84da1f793ed513", "Status": "OPERATIONAL", "StatusMessage": "This Resolver Endpoint is operational.", "CreationTime": "2022-10-28T10:26:41.000081Z", "ModificationTime": "2022-10-28T10:28:31.805Z" } ], "MaxResults": 10 }
Route 53 Resolver Ruleは以下の通りです。
$ aws route53resolver list-resolver-rules { "ResolverRules": [ { "Id": "rslvr-autodefined-rr-internet-resolver", "CreatorRequestId": "", "Arn": "arn:aws:route53resolver:us-east-1::autodefined-rule/rslvr-autodefined-rr-internet-resolver", "DomainName": ".", "Status": "COMPLETE", "RuleType": "RECURSIVE", "Name": "Internet Resolver", "OwnerId": "Route 53 Resolver", "ShareStatus": "NOT_SHARED" }, { "Id": "rslvr-rr-f967a273923045da8", "CreatorRequestId": "AWSConsole.63.1666952801128", "Arn": "arn:aws:route53resolver:us-east-1:<AWSアカウントID>:resolver-rule/rslvr-rr-f967a273923045da8", "DomainName": "corp.non-97.net.", "Status": "COMPLETE", "StatusMessage": "[Trace id: 1-635bae61-798840264a83d2a17062a35b] Successfully created Resolver Rule.", "RuleType": "FORWARD", "Name": "resolver_rule", "TargetIps": [ { "Ip": "10.0.1.10", "Port": 53 } ], "ResolverEndpointId": "rslvr-out-d05047ecfc7e4e389", "OwnerId": "<AWSアカウントID>", "ShareStatus": "NOT_SHARED", "CreationTime": "2022-10-28T10:26:41.298097Z", "ModificationTime": "2022-10-28T10:26:41.298097Z" } ], "MaxResults": 30 }
次にVPCエンドポイントを用意します。今回はFSxのVPCエンドポイントを作成しました。作成したVPCエンドポイントは以下の通りです。
$ aws ec2 describe-vpc-endpoints { "VpcEndpoints": [ { "VpcEndpointId": "vpce-012040b50d1561e8b", "VpcEndpointType": "Interface", "VpcId": "vpc-08b84da1f793ed513", "ServiceName": "com.amazonaws.us-east-1.fsx", "State": "available", "PolicyDocument": "{\n \"Statement\": [\n {\n \"Action\": \"*\", \n \"Effect\": \"Allow\", \n \"Principal\": \"*\", \n \"Resource\": \"*\"\n }\n ]\n}", "RouteTableIds": [], "SubnetIds": [ "subnet-0f2a829b61fbe09df" ], "Groups": [ { "GroupId": "sg-004bd768e7fa0c6af", "GroupName": "default" } ], "IpAddressType": "ipv4", "DnsOptions": { "DnsRecordIpType": "ipv4" }, "PrivateDnsEnabled": true, "RequesterManaged": false, "NetworkInterfaceIds": [ "eni-03b2e748069f1d90c" ], "DnsEntries": [ { "DnsName": "vpce-012040b50d1561e8b-m5vkuenn.fsx.us-east-1.vpce.amazonaws.com", "HostedZoneId": "Z7HUB22UULQXV" }, { "DnsName": "vpce-012040b50d1561e8b-m5vkuenn-us-east-1a.fsx.us-east-1.vpce.amazonaws.com", "HostedZoneId": "Z7HUB22UULQXV" }, { "DnsName": "fsx.us-east-1.amazonaws.com", "HostedZoneId": "Z0245063P0VKD361P590" } ], "CreationTimestamp": "2022-10-28T10:29:45.802000+00:00", "Tags": [], "OwnerId": "<AWSアカウントID>" } ] }
最後に、corp.non-97.net
のゾーンを管理するDNSサーバーでRoute 53 Resolver Inbound Endpointへの条件付きフォワーダーを設定します。
> $fqdn = 'amazonaws.com' > $dnsServers = @('10.0.1.22','10.0.1.36') # Route 53 Resolver Inbound Endpoint > $params = @{ Name = $fqdn MasterServers = $dnsServers ReplicationScope = 'Domain' } > Add-DnsServerConditionalForwarderZone @params # 条件付きフォワーダーが作成されたことを確認 > Get-DnsServerZone ZoneName ZoneType IsAutoCreated IsDsIntegrated IsReverseLookupZone IsSigned -------- -------- ------------- -------------- ------------------- -------- _msdcs.corp.non-97.net Primary False True False False 0.in-addr.arpa Primary True False True False 127.in-addr.arpa Primary True False True False 255.in-addr.arpa Primary True False True False amazonaws.com Forwarder False True False corp.non-97.net Primary False True False False TrustAnchors Primary False True False False
これで、VPCエンドポイントに対して名前解決したときにRoute 53 Resolver Inbound Endpointに転送されるようになりました。
名前解決してみる
それでは、名前解決してセキュリティグループの必要性を確認してみます。
# スタブリゾルバからRoute 53 Resolverをフルサービスリゾルバとして、a.corp.non-97.netの名前解決ができるか $ dig a.corp.non-97.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.corp.non-97.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46778 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;a.corp.non-97.net. IN A ;; ANSWER SECTION: a.corp.non-97.net. 300 IN A 10.2.2.2 ;; Query time: 2 msec ;; SERVER: 10.0.1.2#53(10.0.1.2) ;; WHEN: Fri Oct 28 10:37:54 UTC 2022 ;; MSG SIZE rcvd: 62 # スタブリゾルバからcorp.non-97.netのゾーンを管理するDNSサーバーをフルサービスリゾルバとして、VPCエンドポイントの名前解決ができるか $ dig fsx.us-east-1.amazonaws.com @10.0.1.10 ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> fsx.us-east-1.amazonaws.com @10.0.1.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53589 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4000 ;; QUESTION SECTION: ;fsx.us-east-1.amazonaws.com. IN A ;; ANSWER SECTION: fsx.us-east-1.amazonaws.com. 60 IN A 10.0.1.12 ;; Query time: 6 msec ;; SERVER: 10.0.1.10#53(10.0.1.10) ;; WHEN: Fri Oct 28 10:39:01 UTC 2022 ;; MSG SIZE rcvd: 72
どちらのパターンも名前解決できました。
ということで、Inbound Endpointのアウトバウンドルールと、Outbound Endpointのインバウンドルールは設定する必要はなさそうです。どうやらRoute 53 Resolver EndpointとRoute 53 Resolver間の通信はセキュリティグループで制御できないようです。
おまけで、Inbound Endpointのインバウンドルールと、Outbound Endpointのアウトバウンドルールを削除してしまった場合も名前解決できるのか確認してみます。
以下のように各セキュリティグループのルールを全て削除しました。
# Route 53 Resolver Inbound Endpointに割り当てるセキュリティグループのルール $ aws ec2 describe-security-group-rules \ --filters 'Name=group-id,Values=sg-0a3c37645af5cc28f' { "SecurityGroupRules": [] } # Route 53 Resolver Outbound Endpointに割り当てるセキュリティグループのルール $aws ec2 describe-security-group-rules \ --filters 'Name=group-id,Values=sg-0daba2c1761b6912d' { "SecurityGroupRules": [] }
この状態で名前解決してみます。
# Outbound Endpointのアウトバウンドルールを削除しても、スタブリゾルバからRoute 53 Resolverをフルサービスリゾルバとして、a.corp.non-97.netの名前解決ができるか $ dig a.corp.non-97.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.corp.non-97.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10698 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;a.corp.non-97.net. IN A ;; ANSWER SECTION: a.corp.non-97.net. 30 IN A 10.2.2.2 ;; Query time: 3 msec ;; SERVER: 10.0.1.2#53(10.0.1.2) ;; WHEN: Fri Oct 28 10:54:40 UTC 2022 ;; MSG SIZE rcvd: 62 # Inbound Endpointのアウトバウンドルールを削除しても、スタブリゾルバからcorp.non-97.netのゾーンを管理するDNSサーバーをフルサービスリゾルバとして、VPCエンドポイントの名前解決ができるか $ dig fsx.us-east-1.amazonaws.com @10.0.1.10 ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> fsx.us-east-1.amazonaws.com @10.0.1.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 30122 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4000 ;; QUESTION SECTION: ;fsx.us-east-1.amazonaws.com. IN A ;; Query time: 1644 msec ;; SERVER: 10.0.1.10#53(10.0.1.10) ;; WHEN: Fri Oct 28 10:54:32 UTC 2022 ;; MSG SIZE rcvd: 56
スタブリゾルバからcorp.non-97.net
のゾーンを管理するDNSサーバーをフルサービスリゾルバとして、VPCエンドポイントの名前解決することはできなくなりました。しかし、スタブリゾルバからRoute 53 Resolverをフルサービスリゾルバとして、a.corp.non-97.net
の名前解決ができてしまっています。
もしかしたらキャッシュの影響かも知れませんね。
corp.non-97.net
のゾーンを管理するDNSサーバーを停止した状態でも名前解決できるか確認してみます。
# Outbound Endpointのアウトバウンドルールを削除しても、スタブリゾルバからRoute 53 Resolverをフルサービスリゾルバとして、a.corp.non-97.netの名前解決ができるか $ dig a.corp.non-97.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.corp.non-97.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30538 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;a.corp.non-97.net. IN A ;; ANSWER SECTION: a.corp.non-97.net. 30 IN A 10.2.2.2 ;; Query time: 0 msec ;; SERVER: 10.0.1.2#53(10.0.1.2) ;; WHEN: Fri Oct 28 11:07:50 UTC 2022 ;; MSG SIZE rcvd: 62 # スタブリゾルバからcorp.non-97.netのゾーンを管理するDNSサーバーをフルサービスリゾルバとして、a.corp.non-97.netの名前解決ができるか $ dig a.corp.non-97.net @10.0.1.10 ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> a.corp.non-97.net @10.0.1.10 ;; global options: +cmd ;; connection timed out; no servers could be reached
corp.non-97.net
のゾーンを管理するDNSサーバーを停止しているので、corp.non-97.net
のゾーンを管理するDNSサーバーをフルサービスリゾルバに指定した場合は名前解決できませんでしたが、Route 53 Resolverをフルサービスリゾルバとして指定した場合は継続して名前解決しています。
以上のことからRoute 53 ResolverはDNSのキャッシュを持っていることが分かります。
Route 53 Resolver EndpointとRoute 53 Resolver間の通信はセキュリティグループで制御できない
Route 53 Resolver Endpointに必要なセキュリティグループのルールを確認してみました。
想定していた通り、Route 53 Resolver EndpointとRoute 53 Resolver間の通信はセキュリティグループで制御できないようです。
こちらの検証のきっかけはチバユキからの質問でした。しっかり検証したのでチバユキも満足するでしょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!